#coding:utf-8

"""
    动态页面模拟点击: 爬取斗鱼直播平台的所有房间信息
"""

import time
#python的测试模块
import unittest

from selenium import webdriver
from lxml import etree
import pymongo


class DouyuSpider(unittest.TestCase):
    #初始化方法,类似__init__()方法
    def setUp(self):
        self.driver = webdriver.PhantomJS()
        self.collection = pymongo.MongoClient().douyu.directory
    
    #具体的测试用例方法, 一定要以test开头
    def testDouyu(self):
        #在浏览器地址栏输入第一页的url地址
        self.driver.get("https://www.douyu.com/directory/all")
        while True:
            #获取当前页面的网页源码
            html = self.driver.page_source
            html_obj = etree.HTML(html)
            #获取所有主播节点的列表
            node_list = html_obj.xpath("//div[@id='live-list-content']//div[@class='mes']")
            for node in node_list:
                item = {}
                try:
                    #房间名
                    item["room_name"] = node.xpath('.//h3[@class="ellipsis"]/text()')[0].strip()
                except:
                    item["room_name"] = None

                if node.xpath('.//span[@class="tag ellipsis"]/text()'):
                    #所属分类
                    item["type_name"] = node.xpath('.//span[@class="tag ellipsis"]/text()')[0].strip()
                else:
                    item["type_name"] =  None
                
                #主播名
                item["directory_name"] = node.xpath('.//span[@class="dy-name ellipsis fl"]/text()')[0].strip()
                #房间人数
                item["people_number"] = node.xpath('.//span[@class="dy-num fr"]/text()')[0].strip() if node.xpath('.//span[@class="dy-num fr"]/text()') else None

                self.collection.insert(item)

            #判断当前页面是否是最后一页,如果是则break退出循环
            if "shark-pager-next shark-pager-disable shark-pager-disable-next" in html:
                break
            #每次循环,点击下一页链接
            self.driver.find_element_by_class_name("shark-pager-next").click()
            time.sleep(1)  #适当休眠有助于减少CPU占用,防止密集爬虫

    #类似__del__()方法 析构方法,销毁对象时执行
    def tearDown(self):
        self.driver.quit()


if __name__ == "__main__":
    unittest.main()

